OpenClaw 安全最佳实践完整指南
安全是部署和使用 AI 助理系统的首要考虑。本文详细介绍如何安全地部署、配置和使用 OpenClaw,包括凭证管理、权限控制、网络安全和审计日志。
一、安全威胁模型
潜在风险
- 凭证泄露:API 密钥、密码、令牌被窃取
- 未授权访问:他人使用你的 AI 助理执行操作
- 数据泄露:敏感信息通过日志或消息外泄
- 命令注入:恶意输入导致执行危险命令
- 供应链攻击:依赖的库或服务被篡改
防护策略
防御层次:
1. 凭证加密存储
2. 访问控制和认证
3. 最小权限原则
4. 操作审计日志
5. 定期安全更新二、凭证安全管理
1. 使用 GPG 加密存储
生成 GPG 密钥
bash
# 生成密钥对(如果没有)
gpg --full-generate-key
# 选择:RSA and RSA
# 密钥长度:4096
# 有效期:2 年
# 输入姓名和邮箱加密敏感文件
bash
# 创建凭证目录
mkdir -p ~/.openclaw/credentials/encrypted
chmod 700 ~/.openclaw/credentials/encrypted
# 加密 Feishu 密钥
gpg --encrypt --recipient "your-email@example.com" \
--output ~/.openclaw/credentials/encrypted/feishu-secret.json.gpg \
feishu-secret.json
# 加密 Gateway Token
gpg --encrypt --recipient "your-email@example.com" \
--output ~/.openclaw/credentials/encrypted/gateway-token.json.gpg \
gateway-token.json
# 设置权限
chmod 600 ~/.openclaw/credentials/encrypted/*.gpg解密使用
bash
# 解密到内存(不写磁盘)
gpg --decrypt ~/.openclaw/credentials/encrypted/feishu-secret.json.gpg
# 或在脚本中使用
FEISHU_SECRET=$(gpg --decrypt ~/.openclaw/credentials/encrypted/feishu-secret.json.gpg 2>/dev/null)2. 使用 PASSWORD.md 管理密码
bash
# 创建密码文件
cat > ~/.openclaw/workspace/PASSWORD.md << 'EOF'
# 加密密码本
## 使用说明
- 本文件存储常用密码的加密版本
- 使用 GPG 加密,仅自己可解密
- 定期更换密码并更新本文件
## 密码列表
### Feishu 应用
- App ID: cli_a3bc4d5e6f7g8h9i
- App Secret: [已加密,见 feishu-secret.json.gpg]
### Gateway
- Token: [已加密,见 gateway-token.json.gpg]
### 服务器
- SSH 密码:[联系管理员获取]
- 数据库密码:[已加密,见 db-password.gpg]
## 更换记录
- 2026-03-19: 初始创建
- 下次更换:2026-06-19
EOF
# 加密密码文件
gpg --encrypt --recipient "your-email@example.com" \
--output ~/.openclaw/workspace/PASSWORD.md.gpg \
~/.openclaw/workspace/PASSWORD.md
# 删除明文
shred -u ~/.openclaw/workspace/PASSWORD.md
# 设置权限
chmod 600 ~/.openclaw/workspace/PASSWORD.md.gpg3. 环境变量管理
bash
# 创建环境变量文件(加密)
cat > ~/.openclaw/env.enc << 'EOF'
export FEISHU_APP_ID="cli_xxx"
export FEISHU_APP_SECRET="xxx"
export GATEWAY_TOKEN="xxx"
export OPENCLAW_WORKSPACE="/home/pao/.openclaw/workspace"
EOF
gpg --encrypt --recipient "your-email@example.com" \
--output ~/.openclaw/env.enc \
~/.openclaw/env
shred -u ~/.openclaw/env
chmod 600 ~/.openclaw/env.enc
# 在启动脚本中加载
echo 'eval $(gpg --decrypt ~/.openclaw/env.enc 2>/dev/null)' >> ~/.bashrc三、文件权限管理
1. 关键文件权限检查
bash
#!/bin/bash
# security-check.sh - 安全检查脚本
echo "🔒 检查关键文件权限..."
# 凭证文件
check_permission() {
local file=$1
local expected=$2
local actual=$(stat -c %a "$file" 2>/dev/null)
if [ "$actual" = "$expected" ]; then
echo "✅ $file: $actual"
else
echo "❌ $file: $actual (应为 $expected)"
chmod $expected "$file"
echo " 已修复为 $expected"
fi
}
# 检查凭证
check_permission ~/.openclaw/credentials/encrypted/*.gpg 600
check_permission ~/.openclaw/openclaw.json 600
check_permission ~/.openclaw/identity/device-auth.json 600
# 检查工作区敏感文件
check_permission ~/.openclaw/workspace/PASSWORD.md.gpg 600
check_permission ~/.openclaw/env.enc 600
# 检查脚本
check_permission ~/.openclaw/scripts/*.sh 755
echo "✅ 权限检查完成"2. 自动化权限修复
bash
#!/bin/bash
# fix-permissions.sh - 自动修复权限
set -e
echo "🔧 修复 OpenClaw 文件权限..."
# 凭证目录
find ~/.openclaw/credentials -type f -exec chmod 600 {} \;
find ~/.openclaw/credentials -type d -exec chmod 700 {} \;
# 配置文件
chmod 600 ~/.openclaw/openclaw.json
chmod 600 ~/.openclaw/identity/*.json
# 工作区
chmod 755 ~/.openclaw/workspace
chmod 644 ~/.openclaw/workspace/*.md
# 脚本
find ~/.openclaw/scripts -name "*.sh" -exec chmod 755 {} \;
echo "✅ 权限修复完成"四、网络安全配置
1. Nginx 安全配置
nginx
# /etc/nginx/sites-available/openclaw
server {
listen 80;
server_name www.AiTimes.net;
# 强制 HTTPS
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name www.AiTimes.net;
# SSL 配置
ssl_certificate /etc/letsencrypt/live/AiTimes.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/AiTimes.net/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
# 安全头
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline';" always;
# 隐藏版本信息
server_tokens off;
# 限制请求大小
client_max_body_size 10M;
# 限制请求频率
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
limit_req zone=one burst=20 nodelay;
# 网站根目录
root /var/www/html;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
# 禁止访问敏感文件
location ~ /\. {
deny all;
}
location ~* \.(git|env|md|log)$ {
deny all;
}
}2. 防火墙配置
bash
#!/bin/bash
# firewall-setup.sh - 防火墙配置
# 启用 UFW
ufw --force enable
# 默认策略
ufw default deny incoming
ufw default allow outgoing
# 允许必要端口
ufw allow 22/tcp comment "SSH"
ufw allow 80/tcp comment "HTTP"
ufw allow 443/tcp comment "HTTPS"
# 限制 SSH 访问(可选,替换为你的 IP)
# ufw allow from 192.168.1.0/24 to any port 22
# 查看状态
ufw status verbose3. SSH 安全加固
bash
# /etc/ssh/sshd_config 配置
# 禁用密码登录(使用密钥)
PasswordAuthentication no
PubkeyAuthentication yes
# 禁用 root 登录
PermitRootLogin no
# 更改默认端口(可选)
Port 2222
# 限制用户
AllowUsers pao
# 空闲超时
ClientAliveInterval 300
ClientAliveCountMax 2
# 重启 SSH 服务
systemctl restart sshd五、操作审计日志
1. 启用详细日志
javascript
// openclaw.json 配置
{
"logging": {
"level": "info",
"file": "/var/log/openclaw/main.log",
"maxSize": "100M",
"maxFiles": 10,
"includeTools": true,
"includeMessages": true
}
}2. 安全事件日志
bash
#!/bin/bash
# security-audit.sh - 安全审计脚本
LOG_DIR="/var/log/openclaw/security"
mkdir -p "$LOG_DIR"
echo "🔍 安全审计 - $(date)" >> "$LOG_DIR/audit.log"
# 检查登录日志
echo "=== SSH 登录记录 ===" >> "$LOG_DIR/audit.log"
last -20 >> "$LOG_DIR/audit.log"
# 检查 sudo 使用
echo "=== Sudo 使用记录 ===" >> "$LOG_DIR/audit.log"
grep "sudo" /var/log/auth.log | tail -20 >> "$LOG_DIR/audit.log"
# 检查文件权限变更
echo "=== 敏感文件权限 ===" >> "$LOG_DIR/audit.log"
ls -la ~/.openclaw/credentials/ >> "$LOG_DIR/audit.log"
ls -la ~/.openclaw/*.json >> "$LOG_DIR/audit.log"
# 检查网络连接
echo "=== 网络连接 ===" >> "$LOG_DIR/audit.log"
netstat -tulpn | grep LISTEN >> "$LOG_DIR/audit.log"
# 检查进程
echo "=== 运行的进程 ===" >> "$LOG_DIR/audit.log"
ps aux | grep -E "node|nginx|openclaw" >> "$LOG_DIR/audit.log"
echo "✅ 审计完成,报告:$LOG_DIR/audit.log"3. 异常行为检测
bash
#!/bin/bash
# anomaly-detect.sh - 异常检测
# 检查异常登录
FAILED_LOGINS=$(grep "Failed password" /var/log/auth.log | wc -l)
if [ $FAILED_LOGINS -gt 10 ]; then
echo "⚠️ 警告:检测到 $FAILED_LOGINS 次失败登录尝试"
# 发送告警
fi
# 检查异常文件访问
SENSITIVE_ACCESS=$(grep -E "credentials|PASSWORD|secret" /var/log/syslog | wc -l)
if [ $SENSITIVE_ACCESS -gt 50 ]; then
echo "⚠️ 警告:检测到 $SENSITIVE_ACCESS 次敏感文件访问"
fi
# 检查异常网络流量
HIGH_TRAFFIC=$(iftop -t -s 10 2>/dev/null | head -5)
echo "📊 网络流量TOP5: $HIGH_TRAFFIC"六、定时安全检查
配置每日检查
javascript
cron(
action="add",
job={
name: "夜间安全检查",
schedule: {
kind: "cron",
expr: "30 23 * * *",
tz: "Asia/Shanghai"
},
payload: {
kind: "agentTurn",
message: `
执行夜间安全检查:
1. 检查 OpenClaw 网关状态
- openclaw gateway status
- 异常则重启
2. 检查 Nginx 服务
- systemctl status nginx
- 异常则重启
3. 检查配置文件权限
- 所有敏感文件应为 600
- 异常则修复
4. 检查磁盘空间
- df -h /home
- >90% 则清理
5. 检查内存使用
- free -h
- >90% 则清理浏览器进程
6. 生成检查报告
- 保存到 ~/.openclaw/logs/security/
- 有问题则发送飞书通知
`,
timeoutSeconds: 600
},
sessionTarget: "isolated"
}
)配置早上上报
javascript
cron(
action="add",
job={
name: "早上安全上报",
schedule: {
kind: "cron",
expr: "0 8 * * *",
tz: "Asia/Shanghai"
},
payload: {
kind: "agentTurn",
message: `
读取昨晚的安全检查报告:
- 位置:~/.openclaw/logs/security/pending/
如有问题:
1. 发送到飞书通知
2. 移动到已上报目录
如无问题:
- 静默退出,不发送通知
`,
timeoutSeconds: 300
},
sessionTarget: "isolated"
}
)七、应急响应
1. 凭证泄露处理
bash
#!/bin/bash
# emergency-revoke.sh - 凭证吊销脚本
echo "🚨 紧急凭证吊销程序"
# 1. 立即更改所有密码
echo "1. 请立即更改以下密码:"
echo " - Feishu 应用密钥"
echo " - Gateway Token"
echo " - 服务器密码"
echo " - 数据库密码"
# 2. 撤销访问令牌
echo "2. 撤销所有活动的访问令牌"
echo " - Feishu: 应用管理后台"
echo " - Gateway: 设备管理"
# 3. 检查日志
echo "3. 检查异常活动日志"
tail -100 /var/log/openclaw/main.log
# 4. 重新生成凭证
echo "4. 重新生成并加密新凭证"
# ... 执行凭证生成流程 ...
echo "✅ 紧急处理完成"2. 未授权访问处理
bash
#!/bin/bash
# lock-down.sh - 系统锁定脚本
echo "🔒 系统锁定程序启动"
# 1. 停止网关
openclaw gateway stop
# 2. 停止 Nginx
systemctl stop nginx
# 3. 断开所有网络连接
# ufw --force disable # 谨慎使用
# 4. 记录当前状态
ps aux > /tmp/process-snapshot.txt
netstat -tulpn > /tmp/network-snapshot.txt
# 5. 通知管理员
echo "系统已锁定,请立即检查!"
echo "✅ 系统已锁定"八、安全清单
部署前检查
- [ ] 生成并配置 GPG 密钥
- [ ] 加密所有凭证文件
- [ ] 设置正确的文件权限
- [ ] 配置防火墙规则
- [ ] 加固 SSH 配置
- [ ] 配置 Nginx 安全头
- [ ] 启用日志记录
- [ ] 配置定时安全检查
日常维护
- [ ] 每日检查安全日志
- [ ] 每周审查访问记录
- [ ] 每月更新系统和依赖
- [ ] 每季度更换密码
- [ ] 每半年进行安全审计
事件响应
- [ ] 建立应急响应流程
- [ ] 准备凭证吊销脚本
- [ ] 配置告警通知渠道
- [ ] 定期演练应急流程
九、总结
安全是一个持续的过程,需要:
| 层面 | 措施 |
|---|---|
| 凭证 | GPG 加密、定期更换 |
| 权限 | 最小权限、文件 600 |
| 网络 | 防火墙、HTTPS、SSH 加固 |
| 审计 | 详细日志、定期检查 |
| 应急 | 响应流程、快速吊销 |
记住:安全无小事,预防胜于补救。
相关资源: